<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Node.js相关知识点</title>
</head>
<style>
    html,
    body {
        width: 100%;
        height: 100%;
        padding: 0px;
        margin: 0px;
    }

    a {
        text-decoration: none;
    }

    body {
        color: rgb(86, 156, 214);
    }

    p {
        color: white;
    }

    #container {
        width: 100%;
        display: flex;
    }

    #box-menu {
        width: 20%;
        background-color: rgb(37, 37, 38);
        position: relative;
    }

    #box {
        width: 80%;
        background-color: rgb(30, 30, 30);
        padding-left: 50px;
        padding-right: 50px;
    }

    #fixed-box {
        width: 19%;
        position: fixed;
        top: 0px;
        left: 0px;
        padding-left: 12px;
        font-size: 12px;
    }

    .clear_fix::after {
        content: "";
        display: block;
        width: 0px;
        height: 0px;
        clear: both;
        visibility: hidden;
        overflow: hidden;
    }

    /* #container #box-menu #fixed-box div>h3{
        color: red;
    } */
    #fixed-box>div>h5>a {
        color: rgb(204, 204, 204);
    }
</style>

<body>
    <div id="container">
        <div id="box-menu" class="clear_fix">
            <div id="fixed-box">
                <div>
                    <h5><a href="#1">一、node.js的组成</a></h5>
                </div>
                <div>
                    <h5><a href="#2">二、CommonJs模块(node.js自带)</a></h5>
                </div>
                <div>
                    <h5><a href="#3">三、node.js中的包</a></h5>
                </div>
                <div>
                    <h5><a href="#4">四、包的重要组成文件: package.json</a></h5>
                </div>
                <div>
                    <h5><a href="#5">五、node.js中的模块</a></h5>
                </div>
                <div>
                    <h5><a href="#6">六、path模块(自身的核心模块)</a></h5>
                </div>
                <div>
                    <h5><a href="#7">七、Http模块(自身的核心模块)</a></h5>
                </div>
                <div>
                    <h5><a href="#8">八、Express</a></h5>
                </div>
                <div>
                    <h5><a href="#9">九、PM2进程管理</a></h5>
                </div>
                <div>
                    <h5><a href="#10">十、MongoDB</a></h5>
                </div>
                <div>
                    <h5><a href="#11">十一、mongoose</a></h5>
                </div>
                <div>
                    <h5><a href="#12">十二、adminMongo</a></h5>
                </div>
                <div>
                    <h5><a href="#13">十三、PMVC</a></h5>
                </div>
                <div>
                    <h5><a href="#14">十四、bcrypt加密密码</a></h5>
                </div>
                <div>
                    <h5><a href="#15">十五、async 和 await</a></h5>
                </div>
                <div>
                    <h5><a href="#16">十六、ros跨域</a></h5>
                </div>
                <div>
                    <h5><a href="#17">十七、jsonwebtoken</a></h5>
                </div>
                <div>
                    <h5><a href="#18">十八、session</a></h5>
                </div>

            </div>
        </div>
        <div id="box">
            <div>
                <h2 id="1">node.js的组成：</h2>
                <p>
                    ECMAscript、模块成员（通过该const a = require()应用）、全局成员（直接使用的语法）
                </p>
            </div>
            <div>
                <h2 id="2">CommonJs模块(node.js自带)：</h2>
                <p>实现js模块化而制定了一套规范，方便各个模块之间的依赖和调用，通过module.exports暴露和requires引用</p>
            </div>
            <div>
                <h2 id="3">node.js中的包:</h2>
                <p>1、内置的包</p>
                <p>2、第三方包</p>
            </div>
            <div>
                <h2 id="4">包的重要组成文件: package.json</h2>
                <h3>说明:</h3>
                <p>
                    1、定义了项目所需要的各种模块，以及项目的配置信息（比如名称、版本、许可证等元数据）。
                    npm install命令根据这个配置文件，自动下载所需的模块（即常说的“补依赖”），也就是配置项目所需的运行和开发环境
                </p>
                <p>
                    2、--save参数表示将该模块写入dependencies属性，--save-dev表示将该模块写入devDependencies属性(便于后期根据这个信息，补齐依赖)
                    类似于：$ npm install express --save
                    $ npm install express --save-dev
                </p>
            </div>
            <div>
                <h2 id="5">node.js中的模块：</h2>
                <p>1、(自身的核心模块)</p>
                <p>2、(第三方文件模块)</p>
            </div>
            <div>
                <h2 id="6">path模块(自身的核心模块)：</h2>
                <p>
                    作用: 可以用来拼接地址
                </p>
                <p>
                    常用方法： path.join()、path.resolve()
                </p>
            </div>
            <div>
                <h2 id="7">Http模块(自身的核心模块):</h2>
                <p>
                    作用: 用于手动的搭建服务器，实现处理请求的功能
                </p>
                <p>
                    常用方法： http.createServer
                </p>
            </div>
            <div>
                <h2>nodemon:</h2>
                <p>
                    用来监听node.js变化，并且实时更新
                </p>
            </div>
            <div>
                <h2 id="8">Express:</h2>
                <h3>是什么：</h3>
                <p>
                    基于 Node.js 后端Javascript平台之上，开发出来的一套Web开发框架
                </p>
                <p>
                    Express中，基于 原生Node的特性，做了进一步的封装，提供了一些更加好用的方法，来提高Web开发的体验
                </p>
                <p>
                    Express中，并没有覆盖或者删除原生的http模块方法
                </p>
                <h3>安装：</h3>
                <p>
                    express 项目包名称
                </p>
                <p>
                    进入项目包：cd 项目包名称
                </p>
                <p>
                    补齐依赖(生成node_modules文件夹):npm i或者yarn
                </p>
                <p>
                    启动项目：npm start
                </p>
                <h3>express静态托管静态资源</h3>
                <p>
                    通过访问public内部文件，即可执行相应的html和图片等资源
                </p>
                <p>
                    在app.js文件中设置相应的代码块：app.use(express.static(path.join(__dirname, 'public')));
                </p>
                <h3>ejs模板引擎：</h3>
                <h4>作用：</h4>
                <p>
                    渲染动态页面
                </p>
                <h4>安装: </h4>
                <p>
                    npm i ejs -s
                </p>
                <h3>express中提供的路由</h3>
                <h4>功能：</h4>
                <p>
                    主要负责分发请求处理
                </p>
                <h4>步骤：</h4>
                <p>
                    一、app.js中设置 (1)var usersRouter = require('./routes/users'); (2)app.use('/users', usersRouter);
                </p>
                <p>
                    二、routes文件中设置users.js文件内容，并暴露路由
                </p>
            </div>
            <div>
                <h2 id="9">PM2进程管理</h2>
                <h3>作用：</h3>
                <p>
                    专门用于node进程管理
                </p>
                <h3> 安装：</h3>
                <p>
                    npm install pm2 -g
                </p>
                <h3>相关命令：</h3>
                <p>
                    启动进程：pm2 start bin/www 或者 pm2 start app.js
                </p>
                <p>
                    重命名进程： pm2 start app.js --name wb123
                </p>
                <p>
                    添加进程： pm2 start bin/www --watch
                </p>
                <p>
                    结束进程： pm2 stop www
                </p>
                <p>
                    结束所有进程: pm2 stop all
                </p>
                <p>
                    删除进程: pm2 delete www
                </p>
                <p>
                    删除所有进程：pm2 delete all
                </p>
                <p>
                    列出所有进程：pm2 list
                </p>
                <p>
                    重启进程：pm2 restart www
                </p>
                <p>
                    重启所有进程：pm2 restart all
                </p>
                <p>
                    ...
                </p>
            </div>
            <div>
                <h2 id="10">MongoDB:</h2>
                <p>
                    MongoDB 是一个非关系型的数据库 nosql
                </p>
                <h3>基础语法：</h3>
                <p>
                    创建数据库：use 数据库的名称
                </p>
                <p>
                    查看数据库：show dbs
                </p>
                <p>
                    删除数据库: db.dropDatabase() => 需要先通过use Database_name进入数据库
                </p>
                <p>
                    查看集合：show collections
                </p>
                <p>
                    创建集合：db.createCollection(name,option)
                </p>
                <p>
                    删除集合：db.集合名称.drop()
                </p>
                <p>
                    往集合中插入文档: db.集合的名称.insert({对象内容})
                </p>
                <p>
                    向指定集合中插入一条文档数据：db.collection.insertOne({键名：键值})
                </p>
                <p>
                    向指定结合中插入多条文档数据： db.collection.insertMany({对象内容})
                </p>
                <p>
                    删除文档: db.集合名字.deleteOne(query)/db.集合名字.deleteMany()
                </p>
                <p>
                    更新文档：db.集合名字.update({键名1：键值1},{$set:{键名1：键值2}})
                </p>
                <p>
                    文档查询：db.集合名字.find()
                </p>
            </div>
            <div>
                <h2 id="11">mongoose:</h2>
                <h3>是什么：</h3>
                <p>
                    mongoose是一个node操作mongoDB数据库的三方模块
                </p>
                <h3>作用： </h3>
                <p>
                    使用mongoose操作数据库可以大大提升开发效率
                </p>
                <h3>安装：</h3>
                <p>
                    yarn add mongoose
                </p>
            </div>
            <div>
                <h2 id="12">adminMongo:</h2>
                <p>
                    是什么： 操作数据库的可视化工具
                </p>
                <p>
                    安装： npm install admin-mongo
                </p>
                <p>
                    进入文件夹: cd adminMongo
                </p>
                <p>
                    安装依赖：npm install
                </p>
                <p>
                    启动应用： npm start
                </p>
                <p>
                    在浏览器输入http://127.0.0.1:1234访问
                </p>
            </div>
            <div>
                <h2 id="13">PMVC:</h2>
                <h3>思维构图：</h3>
                <p>
                    <img src="./img/1.png" alt="">
                </p>
                <h3>作用:</h3>
                <p>
                    构建后台api
                </p>
            </div>
            <div>
                <h2 id="14">bcrypt加密密码:</h2>
                <h3>是什么：</h3>
                <p>
                    一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移
                </p>
                <h3>应用：</h3>
                <p>
                    项目中用到需要对登录密码进行加密
                </p>
            </div>
            <div>
                <h2 id="15">async 和 await</h2>
                <h3>是什么：</h3>
                <p>
                    async使用在函数前面，把函数变成一个异步函数，返回值是个promise对象
                </p>
                <h3>
                    注意点:
                </h3>
                <p>
                    1、await关键字必须位于async函数内部
                </p>
                <p>
                    2、await关键字后面需要一个promise对象（不是的话就调用resolve转换它）
                </p>
                <p>
                    3、await关键字的返回结果就是其后面Promise执行的结果，可能是resolved或者rejected的值，注意最后执行完的是个值
                </p>
                <p>
                    4、不能在普通箭头函数中使用await关键字，需要在箭头函数前面添加async
                </p>
            </div>
            <div>
                <h2 id="16">cros跨域：</h2>
                <h3>功能：</h3>
                <p>
                    实现跨域通信
                </p>
                <h3>固定代码：</h3>
                <p>
                    <img src="./img/2.png" alt="">
                </p>
                <h3>
                    与jsonp的区别:
                </h3>
                <p>
                    1、CORS与JSONP的使用目的相同，但是比JSONP更强大
                </p>
                <p>
                    2、JSONP只支持GET请求，CORS支持所有类型的HTTP请求
                </p>
                <p>
                    3、JSONP的优势在于支持老式浏览器，以及可以向不支持CORS的网站请求数据
                </p>
            </div>
            <div>
                <h2 id="17">jsonwebtoken:</h2>
                <h3>是什么：</h3>
                <p>
                    JSON Web Token（JWT）是一个开放标准（RFC 7519），它定义了一种紧凑的、独立的方式，用于安全地在当事人之间传递信息作为一个JSON对象。
                    这些信息可以被验证和信任，因为它是数字签名的。
                    JWT可以使用一个secret （使用HMAC算法）或使用RSA的公钥/私钥对来签名
                </p>
                <h3>图解：</h3>
                <p>
                    <img src="./img/3.jpg" alt="">
                </p>
                <h3>jwt的作用：</h3>
                <p>
                    1、请求的时候进行校验 保障数据安全
                </p>
                <p>
                    2、JWT可以获取荷载的参数 用于前后端交互 减少数据库的查找操作
                </p>
                <p>
                    3、JWT就是一个很长的加密字符串
                </p>
                <p>
                    4、保持用户登入状态
                </p>
                <h3>jwt的优点：</h3>
                <p>
                    1、可扩展性好
                </p>
                <p>
                    2、应用程序分布式部署的情况下，session需要做多机数据共享，通常可以存在数据库或者redis里面。而jwt不需要。
                </p>
                <p>
                    3、无状态
                </p>
                <p>
                    4、jwt不在服务端存储任何状态。RESTful
                    API的原则之一是无状态，发出请求时，总会返回带有参数的响应，不会产生附加影响。用户的认证状态引入这种附加影响，这破坏了这一原则。另外jwt的载荷中可以存储一些常用信息，用于交换信息，有效地使用
                    JWT，可以降低服务器查询数据库的次数。
                </p>
                <h3>jwt的缺点：</h3>
                <p>
                    1、安全性
                </p>
                <p>
                    2、性能
                </p>
                <p>
                    3、一次性（无法废弃、续签）
                </p>
            </div>
            <div>
                <h2 id="18">session:</h2>
                <h3>概念：</h3>
                <p>
                    session是服务器开辟出来的一块内存 用于储存用户信息 并且也可以设置
                </p>
            </div>
        </div>
    </div>
</body>

</html>